#include<stdio.h>
#include<unistd.h>
#include<signal.h> // 引入信号处理头文件
#include<sys/time.h> // 引入时间处理头文件

int i = 0; // 全局变量，用于记录秒数

// 将毫秒转换为timeval结构体中的参数
void timeChange(int ms, struct timeval* ptVal) {
    ptVal->tv_sec = ms / 1000; // 转换为秒数
    ptVal->tv_usec = (ms % 1000) * 1000; // 将毫秒部分转换为微秒
}

// 信号处理函数，当SIGALRM信号触发时执行
void alarmsign_handler(int SignNo) {
    printf("%d seconds\n", ++i); // 每秒钟将全局变量的值加1并显示
}

int main() {
    signal(SIGALRM, alarmsign_handler); // 注册SIGALRM信号的处理函数
    struct itimerval tval; // 定义一个itimerval结构体变量，用于设置定时器
    
    // 设初始间隔为1毫秒（这里应该是有误的，通常不会设置这么短的初始间隔）
    timeChange(1, &tval.it_value); 
    // 设置总间隔为1000毫秒（即每隔1秒触发一次SIGALRM信号）
    timeChange(1000, &tval.it_interval); 
    
    setitimer(ITIMER_REAL, &tval, NULL); // 启动定时器
    
    // 主程序在此循环，当用户输入'#'时，程序退出
    while(getchar() != '#'); 
    
    return 0;
}

// 注意事项：
// 1. 代码中包含了一些小错误，例如#include指令中的"include"应为"<>"或""包围的头文件名，以及main函数末尾的分号应为";"而非“；”。
// 2. timeChange函数的注释说明了其功能，即将毫秒转换为timeval结构体所需的秒和微秒。
// 3. alarmsign_handler函数是SIGALRM信号的处理函数，每次信号触发时，它会打印出全局变量i的值，并递增i。
// 4. main函数中设置了定时器，初始间隔设置为1毫秒（可能是一个错误，因为通常不会设置这么短的间隔），然后每隔1000毫秒（1秒）触发一次SIGALRM信号。
// 5. 程序在主循环中等待用户输入'#'字符，输入后程序退出。

